package com.hns.tool.task.impl;

import com.hns.tool.task.BackendTask;
import com.hns.tool.task.taque.Task;
import com.hns.tool.task.taque.Task.Priority;

/**
 * 基于taque的后台任务定义类
 * @author:wucx
 * @email:zhuangcaijin@126.com
 * @version Revision 2.0.0
 */
public abstract class TaqueTask implements BackendTask{

	private InnerTask itask = new InnerTask(this);
	
	/**
	 * 存放执行结果
	 */
	protected Object result = null;
	
	/**
	 * 构造
	 * @return
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	Task getTask() {
		return itask;
	}
	
	/**
	 * 任务执行的优先级
	 * @param p 取值：1-5； 1为最高级，最优先执行
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	@Override
	public void priority(int p) {
		switch (p) {
		case 1 :
			itask.setPriority(Priority.Highest);
			break;
		case 2 :
			itask.setPriority(Priority.High);
			break;
		case 3 :
			itask.setPriority(Priority.Normal);
			break;
		case 4 :
			itask.setPriority(Priority.Low);
			break;
		default :
			itask.setPriority(Priority.Lowest);
		}
	}
	
	/**
	 * 设置任务执行的超时时间，默认允许运行300秒
	 * @param second 时间（秒）
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	@Override
	public void timeout(int second) {
		itask.setTimeout(second);
	}
	
	/**
	 * 任务的结果
	 * @return 返回执行的结果
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	@Override
	public Object result() {
		return result;
	}
	
	/**
	 * 标识符， 唯一性标识
	 * 防止短时间重复添加同一个任务
	 * @return 标识符字符串
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	@Override
	public String identifier() {
		return toString();
	}
	
	/**
	 * 返回哈希码
	 * @email:zhuangcaijin@126.com
	 */
	public int hashCode() {
		return toString().hashCode();
	}
	
	/**
	 * 后台执行服务
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 * @version Revision 2.0.0
	 */
	class InnerTask extends Task {
		
		BackendTask sup;
		
		public InnerTask(BackendTask backendTask) {
			sup = backendTask;
		}

		protected void prepare() {
			super.prepare();
			sup.reset();
		}
		
		@Override
		protected void execute() {
			sup.run();
		}

		@Override
		protected void cancel() {
			sup.reset();
		}

		@Override
		protected void end() {
			sup.end();
		}
		
	}
	

}
